package Concurrency1.Chapter01_并发编程基础;

import java.util.concurrent.TimeUnit;

/**
 * 功能说明：有关线程的常用方法
 * 开发人员：@author MaLi
 */
public class C03_SomeMethods {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();
        Thread someThread = new Thread(() -> {
            synchronized (lock) {
                System.out.println("进入临界区...");
                try {
                    //方法1: wait作用, 当前线程进入Wating状态, 并且释放锁 (注意, 被notify唤醒之后, 由Waiting状态进入Blocked状态, 重新获取锁)
                    lock.wait(); //此处只为说明该函数, 程序使用方式不对, 因为只有wait没有notify, 程序永远wait在这里不会结束
                    System.out.println("some 业务逻辑...");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("跳出临界区...");
            }
        }, "SomeThread");

        //方法2: sleep()
        TimeUnit.SECONDS.sleep(10); //这里的作用: 主线程进入 TimedWaiting 状态

        //方法3: join, 宿主线程进入阻塞状态(这里指main线程, 进入阻塞状态), 直到被join的线程执行完
        someThread.join(); // 这里: 主线程进入Blocked状态
    }
}
